package com.aggron.service.impl;

import com.aggron.dao.SysAclMapper;
import com.aggron.dao.SysAclModuleMapper;
import com.aggron.entity.SysAclModule;
import com.aggron.exception.ParamException;
import com.aggron.params.AclModuleParams;
import com.aggron.service.ISysAclModuleService;
import com.aggron.util.BeanValidator;
import com.aggron.util.CollectionsUtil;
import com.aggron.util.LevelUtil;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author liuhuan
 * @since 2018-06-02
 */
@Service
public class SysAclModuleServiceImpl extends ServiceImpl<SysAclModuleMapper, SysAclModule> implements ISysAclModuleService {

    @Autowired
    private SysAclModuleMapper sysAclModuleMapper;

    @Autowired
    private SysAclMapper sysAclMapper;

    @Override
    public void save(AclModuleParams aclModuleParams) {
        BeanValidator.check(aclModuleParams);
        if(checkExist(aclModuleParams.getParentId(),aclModuleParams.getName(),aclModuleParams.getId())){
            throw new ParamException("同一层级下存在相同的模块名");
        }
        SysAclModule sysAclModule=SysAclModule.builder().name(aclModuleParams.getName()).parentId(aclModuleParams.getParentId()).seq(aclModuleParams.getSeq()).status(aclModuleParams.getStatus()).remark(aclModuleParams.getRemark()).build();
        sysAclModule.setLevel(LevelUtil.calculateLevel(getLevel(aclModuleParams.getParentId()),aclModuleParams.getParentId()));
        sysAclModule.setOperator("admin");//TODO
        sysAclModule.setOperateIp("127.0.0.1");//TODO
        sysAclModule.setOperateTime(new Date());
        sysAclModuleMapper.insert(sysAclModule);


    }
    @Override
    public void update(AclModuleParams aclModuleParams) {
        BeanValidator.check(aclModuleParams);
        if(checkExist(aclModuleParams.getParentId(),aclModuleParams.getName(),aclModuleParams.getId())){
            throw new ParamException("同一层级下存在相同的模块名");
        }
        SysAclModule before=sysAclModuleMapper.selectById(aclModuleParams.getId());
        Preconditions.checkNotNull(before,"待更新的权限模块不存在");
        SysAclModule after=SysAclModule.builder().id(aclModuleParams.getId()).name(aclModuleParams.getName()).parentId(aclModuleParams.getParentId()).seq(aclModuleParams.getSeq()).status(aclModuleParams.getStatus()).remark(aclModuleParams.getRemark()).build();
        after.setLevel(LevelUtil.calculateLevel(getLevel(aclModuleParams.getParentId()),aclModuleParams.getParentId()));
        after.setOperator("admin");//TODO
        after.setOperateIp("127.0.0.1");//TODO
        after.setOperateTime(new Date());
        updateWithChild(before,after);
    }

    /**
     * 删除模块
     * @param aclModuleId
     */
    @Override
    public void delete(Integer aclModuleId) {
        SysAclModule sysAclModule=sysAclModuleMapper.selectById(aclModuleId);
        Preconditions.checkNotNull(sysAclModule,"待删除的模块不存在");
        if(sysAclModuleMapper.countByParentId(aclModuleId)>0){
            throw new ParamException("当前模块下有子模块，无法进行删除");
        }
        if(sysAclMapper.countByAclModuleId(aclModuleId)>0){
            throw new ParamException("当前模块下有权限点，无法进行删除");
        }
        sysAclModuleMapper.deleteById(aclModuleId);
    }

    /**
     * 修改本模块及子模块的level
     * @param before
     * @param after
     */
    @Transactional(rollbackFor = Exception.class)
    private void updateWithChild(SysAclModule before, SysAclModule after) {
        String oldLevel=before.getLevel();
        String nextLevel=before.getLevel();
        if(!nextLevel.equals(oldLevel)){
            List<SysAclModule> sysAclModuleList=sysAclModuleMapper.getAclModuleListByLevel(oldLevel);
            if(!CollectionsUtil.isEmpty(sysAclModuleList)){
                for (SysAclModule sysAclModule:sysAclModuleList) {
                    String level=sysAclModule.getLevel();
                    if(level.indexOf(oldLevel)==0){
                        sysAclModule.setLevel(nextLevel+level.substring(oldLevel.length()));
                    }

                }
            }
            sysAclModuleMapper.updateBatchLevel(sysAclModuleList);

        }
        sysAclModuleMapper.updateById(after);
    }

    /**
         * 检查同级下部门名称是否重复
         * @param parentId
         * @param aclModuleName
         * @param aclModuleId
         * @return
         */
    private boolean checkExist(Integer parentId,String aclModuleName,Integer aclModuleId){

        return sysAclModuleMapper.countParentIdAndName(parentId,aclModuleName,aclModuleId)>0;
    }

    private String getLevel(Integer aclModuleId){
        SysAclModule sysAclModule=sysAclModuleMapper.selectById(aclModuleId);
        if(sysAclModule==null){
            return null;
        }
        return sysAclModule.getLevel();

    }
}
